#pragma once

#include <string>
#include <unordered_map>
#include <chrono>
#include <atomic>
#include <mutex>
#include "market_data_types.h"
#include <spdlog/spdlog.h>

namespace hft {

/**
 * @brief 市场数据质量监控类
 * 
 * 用于监控市场数据的质量，包括：
 * 1. 数据延迟
 * 2. 数据断点
 * 3. 数据异常（价格跳动、成交量异常等）
 * 4. 接收频率
 */
class MarketDataMonitor {
public:
    struct Statistics {
        std::chrono::system_clock::time_point last_update_time;
        double avg_delay_ms{0.0};        // 平均延迟（毫秒）
        double max_delay_ms{0.0};        // 最大延迟（毫秒）
        uint64_t message_count{0};       // 消息计数
        uint64_t error_count{0};         // 错误计数
        double last_price{0.0};          // 最新价格
        double price_change_pct{0.0};    // 价格变化百分比
    };

    MarketDataMonitor();
    ~MarketDataMonitor() = default;

    /**
     * @brief 处理新的市场数据
     * @param data 市场数据消息
     */
    void onMarketData(const MarketDataMessage& data);

    /**
     * @brief 获取指定合约的统计信息
     * @param symbol 合约代码
     * @return 统计信息
     */
    Statistics getStatistics(const std::string& symbol) const;

    /**
     * @brief 检查数据质量
     * @param symbol 合约代码
     * @return true 如果数据质量正常
     */
    bool checkDataQuality(const std::string& symbol) const;

    /**
     * @brief 重置统计信息
     * @param symbol 合约代码，如果为空则重置所有
     */
    void resetStatistics(const std::string& symbol = "");

private:
    /**
     * @brief 检查价格异常
     * @param symbol 合约代码
     * @param price 当前价格
     * @return true 如果价格正常
     */
    bool checkPriceAnomaly(const std::string& symbol, double price) const;

    /**
     * @brief 更新延迟统计
     * @param symbol 合约代码
     * @param delay_ms 当前延迟（毫秒）
     */
    void updateDelayStats(const std::string& symbol, double delay_ms);

    /**
     * @brief 检查数据断点
     * @param symbol 合约代码
     * @param timestamp 当前时间戳
     * @return true 如果数据连续
     */
    bool checkDataGap(const std::string& symbol, 
                     const std::chrono::system_clock::time_point& timestamp) const;

private:
    mutable std::mutex mutex_;
    std::unordered_map<std::string, Statistics> statistics_;
    
    // 配置参数
    const double MAX_PRICE_CHANGE_PCT{10.0};  // 最大价格变化百分比
    const double MAX_DELAY_MS{1000.0};        // 最大允许延迟（毫秒）
    const std::chrono::seconds MAX_GAP{std::chrono::seconds(5)}; // 最大数据间隔
};

} // namespace hft